//
//  TheArrow.swift
//  DataStructure
//
//  Created by kys-20 on 2019/8/26.
//  Copyright © 2019 kys-20. All rights reserved.
//箭头工具类

import Foundation
import UIKit
class TheArrow{
    
    /// 获取箭头的点位置
    ///
    /// - Parameters:
    ///   - fPoint: <#fPoint description#>
    ///   - tPoint: <#tPoint description#>
    /// - Returns: <#return value description#>
   class func getArrowPoint(fPoint:CGPoint,tPoint:CGPoint) -> [CGPoint] {
        var p1 = CGPoint.zero           //箭头点1
        var p2 = CGPoint.zero           //箭头点2
        var p3 = CGPoint.zero           //箭头最前面点
        //假设箭头边长20,箭头是一个等腰三角形
        let line = sqrt(pow(abs(tPoint.x-fPoint.x), 2)+pow(abs(tPoint.y-fPoint.y), 2))
        let arrowH:CGFloat = line>40 ? 20 : line/3
        //线与水平方向的夹角
        let angle = getAnglesWithThreePoints(p1: fPoint, p2: tPoint, p3: CGPoint(x: fPoint.x, y: tPoint.y))
        let _x = CGFloat(fabs(sin(angle)))*arrowH/2
        let _y = CGFloat(fabs(cos(angle)))*arrowH/2
        //向右上角、水平向右
        if tPoint.x >= fPoint.x && tPoint.y <= fPoint.y{
            p1.x = tPoint.x-_x
            p1.y = tPoint.y-_y
            
            p2.x = tPoint.x+_x
            p2.y = tPoint.y+_y
            
            p3.x = tPoint.x+_y*2
            p3.y = tPoint.y-_x*2
            
        }else if tPoint.x > fPoint.x && tPoint.y > fPoint.y{
            //向右下角
            p1.x = tPoint.x+_x
            p1.y = tPoint.y-_y
            
            p2.x = tPoint.x-_x
            p2.y = tPoint.y+_y
            
            p3.x = tPoint.x+_y*2
            p3.y = tPoint.y+_x*2
        }else if tPoint.x < fPoint.x && tPoint.y < fPoint.y{
            //向左上角
            p1.x = tPoint.x-_x
            p1.y = tPoint.y+_y
            
            p2.x = tPoint.x+_x
            p2.y = tPoint.y-_y
            
            p3.x = tPoint.x-_y*2
            p3.y = tPoint.y-_x*2
            
        }else if tPoint.x < fPoint.x && tPoint.y >= fPoint.y{
            //向左下角,水平向左
            p1.x = tPoint.x-_x
            p1.y = tPoint.y-_y
            
            p2.x = tPoint.x+_x
            p2.y = tPoint.y+_y
            
            p3.x = tPoint.x-_y*2
            p3.y = tPoint.y+_x*2
        }else if fPoint.x==tPoint.x {
            //竖直方向
            p1.x=tPoint.x-arrowH/2
            p1.y=tPoint.y
            p2.x=tPoint.x+arrowH/2
            p2.y=tPoint.y
            p3.x=tPoint.x
            p3.y = tPoint.y>fPoint.y ? tPoint.y+arrowH : tPoint.y-arrowH
        }
        
        return [p1,p2,p3]
        //(p1,p2,p3)
    }
    
    
    // 其中，获取夹角方法：getAnglesWithThreePoints
    
    
    /// 计算三点之间的角度
    ///
    /// - Parameters:
    ///   - p1: 点1
    ///   - p2: 点2（也是角度所在点）
    ///   - p3: 点3
    /// - Returns: 角度（180度制）
   class func getAnglesWithThreePoints(p1:CGPoint,p2:CGPoint,p3:CGPoint) -> Double {
        //排除特殊情况，三个点一条线
        if (p1.x == p2.x && p2.x == p3.x) || ( p1.y == p2.x && p2.x == p3.x){
            return 0
        }
        
        let a = abs(p1.x - p2.x)
        let b = abs(p1.y - p2.y)
        let c = abs(p3.x - p2.x)
        let d = abs(p3.y - p2.y)
        
        if (a < 1.0 && b < 1.0) || (c < 1.0 && d < 1.0){
            return 0
        }
        let e = a*c+b*d
        let f = sqrt(a*a+b*b)
        let g = sqrt(c*c+d*d)
        let r = Double(acos(e/(f*g)))
        return r        //弧度值
        
        //        return (180*r/Double.pi)      //角度值
 }
}
